package com.huanyang.usebitmap

import android.content.ContentValues
import android.content.Context
import android.graphics.Bitmap
import android.graphics.pdf.PdfDocument
import android.os.Build
import android.os.Environment
import android.provider.MediaStore
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import java.io.OutputStream

class PdfUtil(private val context: Context) {

    /**
     * 多图转PDF（核心新增方法）
     * @param bitmapList 要转换的Bitmap列表（每张图对应1个PDF页面）
     * @param pdfName PDF文件名（不带后缀）
     * @return 成功返回PDF路径/Uri，失败返回null
     */
    suspend fun convertBitmapsToPdf(bitmapList: List<Bitmap>, pdfName: String): String? = withContext(Dispatchers.IO) {
        try {
            // 1. 创建PDF文档
            val pdfDoc = PdfDocument()

            // 2. 循环为每张图片创建1个PDF页面
            for ((index, bitmap) in bitmapList.withIndex()) {
                // 页面大小：和图片大小一致（避免拉伸）
                val pageInfo = PdfDocument.PageInfo.Builder(bitmap.width, bitmap.height, index + 1).create()
                val page = pdfDoc.startPage(pageInfo)
                // 把图片画到PDF页面上
                page.canvas.drawBitmap(bitmap, 0f, 0f, null)
                pdfDoc.finishPage(page)
            }

            // 3. 适配Android版本，保存PDF到下载目录（和原逻辑一致）
            val contentValues = ContentValues().apply {
                put(MediaStore.Files.FileColumns.DISPLAY_NAME, "$pdfName.pdf")
                put(MediaStore.Files.FileColumns.MIME_TYPE, "application/pdf")
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                    put(MediaStore.Files.FileColumns.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS)
                    put(MediaStore.Files.FileColumns.IS_PENDING, 1)
                } else {
                    val downloadDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
                    val pdfPath = "${downloadDir.absolutePath}/$pdfName.pdf"
                    put(MediaStore.Files.FileColumns.DATA, pdfPath)
                }
            }

            // 4. 写入PDF内容
            val contentResolver = context.contentResolver
            val uri = contentResolver.insert(MediaStore.Files.getContentUri("external"), contentValues) ?: return@withContext null
            val outputStream: OutputStream = contentResolver.openOutputStream(uri) ?: return@withContext null
            pdfDoc.writeTo(outputStream)

            // 5. 收尾工作（取消待处理标记+关闭资源）
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                contentValues.clear()
                contentValues.put(MediaStore.Files.FileColumns.IS_PENDING, 0)
                contentResolver.update(uri, contentValues, null, null)
            }
            pdfDoc.close()
            outputStream.close()

            // 6. 返回PDF路径/Uri（10+返回Uri字符串，10以下返回文件路径）
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) uri.toString()
            else "${Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)}/$pdfName.pdf"

        } catch (e: Exception) {
            e.printStackTrace()
            null
        }
    }
}